package main

import (
	"context"
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"web/controller"

	_ "github.com/go-sql-driver/mysql"
)

// 定义一个全局对象db
var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
	// DSN:Data Source Name
	dsn := "root:zzxziu@tcp(127.0.0.1:3306)/cybathlon?charset=utf8mb4&parseTime=True"
	// 不会校验账号密码是否正确
	// 注意！！！这里不要使用:=，我们是给全局变量赋值，然后在main函数中使用全局变量db
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		return err
	}
	// // 尝试与数据库建立连接（校验dsn是否正确）
	// err = db.Ping()
	// if err != nil {
	// 	return err
	// }
	ctx := context.Background()
	err = db.PingContext(ctx)
	if err != nil {
		return err
	}
	return nil
}

type helloHandler struct{}

func (m *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello world,,,"))
}

type aboutHandler struct{}

func (m *aboutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("aboutttttt,,,"))
}

func main() {
	err := initDB() // 调用输出化数据库的函数
	if err != nil {
		fmt.Printf("init db failed...\nerr:%v\n", err)
		return
	} else {
		fmt.Println("database connected!")
	}

	controller.RegisterRoutes()

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello world,,,"))
	})

	// http.ListenAndServe("localhost:8080", nil)

	mh := helloHandler{}
	ah := aboutHandler{}
	server := http.Server{
		Addr:    "localhost:8080",
		Handler: nil,
	}

	http.Handle("/hello", &mh)
	http.Handle("/about", &ah)

	// one, api_err := queryRowDemo(1, 33)
	// if api_err != nil {
	// 	log.Fatal(api_err.Error())
	// }
	// fmt.Println(one)

	// users, api_err := queryMultiRowDemo()
	// if api_err != nil {
	// 	log.Fatal(api_err.Error())
	// }
	// fmt.Println(users)

	// one.age = 33
	// one.name += ",,,,"
	// api_err = one.Update()
	// if api_err != nil {
	// 	log.Fatalln(api_err.Error())
	// }
	// a1, _ := queryMultiRowDemo()
	// fmt.Println(a1)

	// a2 := goLib{
	// 	name:        "name3,,,",
	// 	age:         30,
	// }
	// fmt.Println(a2)
	// api_err = a2.Insert()
	// if api_err != nil {
	// 	log.Fatalln(api_err.Error())
	// }

	a4 := goLib{
		id:   6,
		name: "Prepare + name3,,,",
		age:  44,
	}
	api_err := a4.prepareUpdateDemo()
	if api_err != nil {
		log.Fatalln(api_err.Error())
	}

	usersPrepare, api_err := prepareQueryDemo(0)
	if api_err != nil {
		log.Fatal(api_err.Error())
	}
	fmt.Println(usersPrepare)

	server.ListenAndServe()

}
